gtkicontheme: check for GdkPixbuf first
authorRyan Lortie <desrt@desrt.ca>
Thu, 1 Aug 2013 21:06:00 +0000 (23:06 +0200)
committerRyan Lortie <desrt@desrt.ca>
Fri, 2 Aug 2013 13:00:08 +0000 (15:00 +0200)
We checked for G_IS_LOADABLE_ICON() before GDK_IS_PIXBUF().

Since we made GdkPixbuf implement GLoadableIcon, the special case for
pixbufs is never used, and the much much slower GLoadableIcon path is
taken instead.  Move the GdkPixbuf one to be first to fix that.

https://bugzilla.gnome.org/show_bug.cgi?id=705320

gtk/gtkicontheme.c

index e5091976c4e74839cc582a3ad6f2df95ab68fc78..5be7dbcfc00ab1c07c4a11f9e502c686003e9004 100644 (file)
@@ -5184,7 +5184,40 @@ gtk_icon_theme_lookup_by_gicon_for_scale (GtkIconTheme       *icon_theme,
   g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL);
   g_return_val_if_fail (G_IS_ICON (icon), NULL);
 
-  if (G_IS_LOADABLE_ICON (icon))
+  if (GDK_IS_PIXBUF (icon))
+    {
+      GdkPixbuf *pixbuf;
+
+      pixbuf = GDK_PIXBUF (icon);
+
+      if ((flags & GTK_ICON_LOOKUP_FORCE_SIZE) != 0)
+        {
+          gint width, height, max;
+          gdouble pixbuf_scale;
+          GdkPixbuf *scaled;
+
+          width = gdk_pixbuf_get_width (pixbuf);
+          height = gdk_pixbuf_get_height (pixbuf);
+          max = MAX (width, height);
+          pixbuf_scale = (gdouble) size * scale / (gdouble) max;
+
+          scaled = gdk_pixbuf_scale_simple (pixbuf,
+                                            0.5 + width * pixbuf_scale,
+                                            0.5 + height * pixbuf_scale,
+                                            GDK_INTERP_BILINEAR);
+
+          info = gtk_icon_info_new_for_pixbuf (icon_theme, scaled);
+
+          g_object_unref (scaled);
+        }
+      else
+        {
+          info = gtk_icon_info_new_for_pixbuf (icon_theme, pixbuf);
+        }
+
+      return info;
+    }
+  else if (G_IS_LOADABLE_ICON (icon))
     {
       info = icon_info_new ();
       info->loadable = G_LOADABLE_ICON (g_object_ref (icon));
@@ -5248,39 +5281,6 @@ gtk_icon_theme_lookup_by_gicon_for_scale (GtkIconTheme       *icon_theme,
       else
         return NULL;
     }
-  else if (GDK_IS_PIXBUF (icon))
-    {
-      GdkPixbuf *pixbuf;
-
-      pixbuf = GDK_PIXBUF (icon);
-
-      if ((flags & GTK_ICON_LOOKUP_FORCE_SIZE) != 0)
-       {
-         gint width, height, max;
-         gdouble pixbuf_scale;
-         GdkPixbuf *scaled;
-
-         width = gdk_pixbuf_get_width (pixbuf);
-         height = gdk_pixbuf_get_height (pixbuf);
-         max = MAX (width, height);
-         pixbuf_scale = (gdouble) size * scale / (gdouble) max;
-
-         scaled = gdk_pixbuf_scale_simple (pixbuf,
-                                           0.5 + width * pixbuf_scale,
-                                           0.5 + height * pixbuf_scale,
-                                           GDK_INTERP_BILINEAR);
-
-         info = gtk_icon_info_new_for_pixbuf (icon_theme, scaled);
-
-         g_object_unref (scaled);
-       }
-      else
-       {
-         info = gtk_icon_info_new_for_pixbuf (icon_theme, pixbuf);
-       }
-
-      return info;
-    }
 
   return NULL;
 }